iT邦幫忙

2024 iThome 鐵人賽

DAY 4
0
Security

你的程式真的安全嗎?從資安的角度做 code review系列 第 19

C - REGEX DoS (拒絕服務:規則表達式 DoS)

  • 分享至 

  • xImage
  •  

下方程式碼片段全部都是擷取自 Secure Code Warrior 線上安全程式培訓平台,因為練習互動時的題目多半不會只有單一個檔案,可能涉及多個檔案、資料夾及多處地方修改,因此我的文章主要是針對最主要的區塊做修改及說明,若有不好理解的地方非常抱歉也還請見諒,也可以實際上去 Secure Code Warrior 玩玩看,搭配著互動,會更有感的學習哦~

C - REGEX DoS (拒絕服務:規則表達式 DoS)

  • 形成原因:當輸入值與規則表達式(regular expressions)匹配時,REGEX引擎將測試所有可能的匹配直到失敗,規則表達式與輸入可能會有很大量的不同組合,處理這些組合可能會花大量時間,導致服務暫時停擺
  • 後果:消耗系統資源,導致伺服器回應變慢、暫停其他程序處理
  • 實例:一個程式開發者為了避免使用者使用帳號做為密碼,因此撰寫了以下程式規則
String userName = textBox1.Text;
String password = textBox2.Text;
Regex testPassword = new Regex(userName);
Match match = testPassword.Match(password);
if (match.Success){
    MessageBox.Show("Bad password!");
}

使用者使用一個對規則表達式有害的帳戶名稱作為帳戶

^(([a-z]) +.)+[A-Z]([a-z])+$

這個輸入有很多重複分組[a-z]彼此互相包含在其中,這增加了REGEX引擎考慮的組合數量,這時攻擊者如果再輸入一個與規則表達式不匹配的長字串作為密碼,因其長度較長將增加REGEX引擎檢查的時間,導致應用程式回應變慢

  • 解決方法:
    • 不允許使用者輸入成為規則表達式的一部份
    • 定期檢查應用程式中的規則表達式是否合理
    • 避免使用包含以下1到多個組合的規則表達式
      (a+)+
      ([a-zA-Z]+)*
      (alaa) +
      (ala?) +

第1題

錯誤區塊

regex b("([a-zA-Z0-9_]+)+");
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:
規則表達式用於輸入驗證,旨在確保只包含字母、數字字元和下劃線。 然而,這種規則表達式容易受到拒絕服務(DoS)攻擊,因為它有可能造成過度回溯,導致系統嚴重減速,甚至完全停止系統。

主要修正方法

把原區塊改成

regex b("^[A-Za-z0-9]\\w+");
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台

解釋:
為了安全的輸入驗證,使用了規則表達式 ^[A-Za-z0-9]\\w+。 這種模式有效地確保字串以字母、數字字元開頭,後跟一個或多個字母、數字字元或下劃線。 與容易過度回溯的模式不同,不受拒絕服務(DoS)攻擊的影響,從而保持系統效能和穩定性。


上一篇
C - uncaught error (拒絕服務:未被捕獲的錯誤)
下一篇
第三屆資安戰士挑戰賽和達人養成計劃 心得分享
系列文
你的程式真的安全嗎?從資安的角度做 code review25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言